package com.sms.plateform.kernel.dao.impl;

import java.lang.reflect.ParameterizedType;
import java.util.List;
import java.util.Map;

import org.springframework.orm.ibatis.support.SqlMapClientDaoSupport;

import com.sms.plateform.common.page.PageProperty;
import com.sms.plateform.kernel.dao.BaseDao;

/**
 * @Description: 基础DAO，包含常用数据库操作。所有DAO必须继承的类
 * @author luj
 * @version 1.0
 * @created Feb 11, 2009
 */
public class BaseDaoImpl<T> extends SqlMapClientDaoSupport implements
		BaseDao<T> {

	Class<T> poClass = (Class<T>) ((ParameterizedType) getClass()
			.getGenericSuperclass()).getActualTypeArguments()[0];

	String poClassName = poClass.getSimpleName();

	/**
     * @Description:得到数据对象
     * @param param map参数
     * @return 实体对象
     */
	public T getModel(Map param) {
		return (T) this.getSqlMapClientTemplate().queryForObject(
				"get" + poClassName, param);
	}

	/**
     * @Description:创建数据对象
     * @param po 实体对象
     */
	public void insert(T model) {
		this.getSqlMapClientTemplate().insert("insert" + poClassName, model);
	}

	 /**
     * @Description:单条修改数据对象
     * @param po 实体对象
     * @return 所影响的行数
     */
	public int update(T model) {
		return this.getSqlMapClientTemplate().update("update" + poClassName,
				model);
	}
	
	 /**
     * @Description:批量修改数据对象
     * @param param map参数
     * @return 所影响的行数
     */
	public int updateList(Map param) {
		return this.getSqlMapClientTemplate().update("updateList" + poClassName,
				param);
	}

	/**
     * @Description:删除数据对象
     * @param param map参数
     * @return 所影响的行数
     */
	public int delete(Map param) {
		return this.getSqlMapClientTemplate().update("delete" + poClassName,param);
	}

	/**
     * @Description:得到数据数量按分页条件
     * @param pp PageProperty对象
     * @return 数据条数
     */
	public int findCount(PageProperty pp) {
		Integer count = (Integer) getSqlMapClientTemplate().queryForObject(
				"get" + poClassName + "Count", pp.getParamMap());
		return count.intValue();
	}

	/**
     * @Description:得到数据对象列表按分页条件 当pp.getNpageSize=0时返回所有
     * @param pp PageProperty对象
     * @return 实体列表
     */
	public List<T> findPageList(PageProperty pp) {
		return this.getSqlMapClientTemplate().queryForList(
				"listSplit" + poClassName, pp.getParamMap());

	}

	/**
     * @Description:得到数据对象列表
     * @param param map参数
     * @return 实体列表
     */
	public List<T> list(Map param) {
		return this.getSqlMapClientTemplate().queryForList(
				"list" + poClassName, param);
	}

	

	
}
